#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
第一行注释是为了告诉Linux/OS X系统，这是一个Python可执行程序，Windows系统会忽略这个注释；
第二行注释是为了告诉Python解释器，按照UTF-8编码读取源代码，否则，你在源代码中写的中文输出可能会有乱码。
'''

'''函数式编程学习'''

'''map()函数接收两个参数，一个是函数，一个是序列，map将传入的函数依次作用到序列的每个元素，并把结果作为新的list返回'''

def add(x):
	return x+1

#每项加1
T=map(add,[1,2,3,4,5,6,7])
print T

#全部转化为字符串
print map(str,[1,2,3,4,5,6])

'''练习：：：：利用map()函数，把用户输入的不规范的英文名字，变为首字母大写，其他小写的规范名字。
输入：['adam', 'LISA', 'barT']，输出：['Adam', 'Lisa', 'Bart']。 ''' 

names=['adam', 'LISA', 'barT','TnagZGGAa11']

#方法一，切片  ,还可以使用name.title()，title()方法将字符串转化为首字母大写其余小写
def f(name):
	if (isinstance(name,str) and len(name)>0):
		return name[0].upper()+name[1:].lower()
		
#方法二，通过下标判断
'''
def f(name):
	if isinstance(name,str):
		s=''
		for index,value in enumerate(name):
			if index==0:
				s=s+value.upper()
			else:
				s=s+value.lower()
		return s
'''
print map(f,names)


'''reduce把一个函数作用在一个序列[x1, x2, x3...]上，这个函数必须接收两个参数，reduce把结果继续和序列的下一个元素做累积计算，'''

def f(x,y):
	return x+y

#类似sum求和
print reduce(f,[1,2,3,4,5,6,7,8,9,10])

'''
请编写一个prod()函数，可以接受一个list并利用reduce()求积。
'''

def f(x,y):
	return x*y

def prod(L):
	return reduce(f,L)

print prod([1,2,3,4,5])


'''filter()也接收一个函数和一个序列。和map()不同的是，filter()把传入的函数依次作用于每个元素，然后根据返回值是True还是False决定保留还是丢弃该元素。'''

#只取偶数
def f(i):
	return i%2==0

print filter(f,[1,2,3,4,5,6,7,8,9])

#去掉空字符串
def f(s):
	return s and len(s)!=0

print filter(f,['A','','AAA',None])



#排序函数（升序）
print sorted([100,1,200,9,20,6])
#倒序,先用获取升序，再用[::-1]倒序
print sorted([100,1,200,9,20,6])[::-1]


'''装饰器'''
import functools

#因为log它是一个decorator，所以接受一个函数作为参数，并返回一个函数
def log(func):
	@functools.wraps(func)
	def wrapper(*args,**kw):
		print 'call %s()' % func.__name__
		return func(*args,**kw)
	return wrapper
	
@log
def now():
	print '2017-05-31'

now()


#带参数的decorator
def log(text):
	def decorator(func):
		@functools.wraps(func)
		def wrapper(*args,**kw):
			print 'text=%s call %s():' %(text,func.__name__)
			return func(*args,**kw)
		return wrapper
	return decorator

@log('safsfaf')
def now():
	print '20111111'
	
now()

'''
请编写一个decorator，能在函数调用的前后打印出'begin call'和'end call'的日志。

再思考一下能否写出一个@log的decorator，使它既支持：
'''

'''
def log(*text):
	def decorator(func):
		@functools.wraps(func)
		def wrapper(*args,**kw):
			print 'begin call %s' %func.__name__
			func(*args,**kw)
			print 'end call %s' %func.__name__
		return wrapper
	return decorator

@log
def f():
	print 'f'

@log('sssss')
def f1():
	print 'f1'

f()
f1()
'''

